<h3>Feb 24, 2009: Added relative file paths and URLs in version 2.1.1</h3>
Now you can <code>read("../file.jsx")</code> and <code>GET("../file.jsx")</code> in your JavaScript code. This makes it much easier to write portable code.

<h3>Feb 22, 2009: Added better error reporting in version 2.0.3</h3>
Some of the error reporting was a bit cryptic in version 2, so it's now improved a bit in version 2.0.3 with some cleaner code. The "app", "token", "script" and "remote_host" are now available to your scripts via the <code>config()</code> function.

<h3>Feb 21, 2009: Added NOTEX_STRICT mode in version 2.0.2</h3>
Now you can choose to run NOTEX CGI scripts using only the Apache "action" to directly run ".jsx" files in the URL path. This option is called NOTEX_STRICT and closes a security hole where remote hostile scripts could be run if someone knew a valid "app" and "token".

<h3>Feb 21, 2009: Major upgrade in version 2.0.0</h3>
This new version makes a number of significant changes:
<ul>
  <li>It's now "app-centric": Replaced "user" with "app" and "users" with "apps"</li>
  <li>The "app" name is taken from a URL of the form ".../apps/<b>name</b>/..."</li>
  <li>Added a <code>read(file)</code> function to include JavaScript files more easily</li>
  <li>Added a default token name of "token" for when tokens are not required</li>
</ul>
The new directory structure places "services" inside "apps", for example "apps/demo/services/finance/quote.js".

<h3>Feb 19, 2009: Added the "env()" function in version 1.6.5</h3>
Now you can get the value of environment variables inside your JavaScript programs using the "env()" function. This enables you to set secret values in your ".htaccess" file using the <code>Setenv NAME value</code> format. For example, you can use this technique to read database usernames and passwords in your scripts, or set a home directory path.

<h3>Feb 18, 2009: Added extra logging info in version 1.6.4</h3>
New improved logging makes it easier to discover which app's script is not terminating. The log event attributes "pid" and "request" enable you to match the log event "Processing" with "Processed" for all successful script runs, and hence detect which scripts are not terminating. Next, I'll make some admin services to do this matching for you.

<h3>Feb 16, 2009: Added PATH_TRANSLATED in version 1.6.3</h3>
Now you can configure your Apache server to run the NOTEX script automatically for files of your chosen extension (but we recommend ".jsx" for executable JavaScript). To do this, just make a <b>.htaccess</b> file like this:
<pre>
Options ExecCGI
AddHandler cgi-script .cgi
AddHandler js-notex .jsx
Action js-notex /notex.cgi
</pre>
You can replace "/notex.cgi" with "/notex.fcgi" if you're using the FastCGI version. It just works!
<ul>
  <li><b>Before:</b> <a href="http://www.notex.com/notex.cgi?script=www.notex.com/test/hello.js&amp;app=demo&amp;token=abcd">http://www.notex.com/notex.cgi?script=www.notex.com/test/hello.js&amp;app=demo&amp;token=abcd</a></li>
  <li><b>After:</b> <a href="http://www.notex.com/test/hello.jsx?app=demo&amp;token=abcd">http://www.notex.com/test/hello.jsx?app=demo&amp;token=abcd</a></li>
</ul>

<h3>Feb 15, 2009: Cleaned up the code in version 1.6.2</h3>
After the past two weeks of rapid development and regular releases, I thought it would be a good opportunity to clean up the code and make the CGI and FastCGI versions as similar to each other as possible. So now you have cleaner code in version 1.6.2 with extra comments.

<h3>Feb 14, 2009: Fixed some global variable bugs in NOTEX FastCGI 1.6.1</h3>
Because the FastCGI version was a simple port of the regular CGI version, I had missed some global variable issues. These are now fixed in version 1.6.1 so you should not see any strange behavior caused by remembered state from one request to another. Next I'll write a test suite to catch any regression bugs in future.

<h3>Feb 10, 2009: Added "header()" and "md5()" functions in version 1.6</h3>
Now you can set HTTP output headers with the "header()" function, giving you more flexibility with your script output. For example, you can redirect with a "-location" header and return a custom status (e.g. 301) with a "-status" header. Call <code>header('-expires', '+1h')</code> to tell browsers to cache the content for 1 hour.<p />
An "md5()" function enables your scripts to use the very useful MD5 hashing function to hide passwords and similar. For example, call <code>md5('mypassword')</code> to get a unique 32 character hex string instead.

<h3>Feb 9, 2009: Added "load()" and "save()" functions in version 1.5</h3>
The private functions "_read_cache()" and "_write_cache()" are now public as "load()" and "save()" making cache control much more flexible for the NOTEX programmer. At 16 public functions, I hope the namespace pollution isn't too high now.

<h3>Feb 8, 2009: Added FastCGI in version 1.4 and added HTTP cookie support</h3>
I've tested a nice FastCGI version of the NOTEX script available here: <a href="http://notex.googlecode.com/files/notex.fcgi">notex.fcgi</a> (you'll need the extra Perl module CGI::Fast before it will work for you). The only downside is that it won't respond to HTTP "DELETE" methods until CGI.pm query string parsing is fixed.<p />
I also added a new method <code>cookie(name, value)</code> so you can get and set cookies using the NOTEX script. This makes NOTEX a good candidate for serving AJAX calls from web pages for logged-in users with session cookies.

<h3>Feb 6, 2009: Released version 1.3 accepting GET, HEAD, POST, PUT and DELETE</h3>
Now you can write NOTEX scripts that respond to all 5 HTTP verbs, as well as using them inside your scripts to request resources. I want to make NOTEX as RESTful as possible. I also changed the "config()" settings, added "http()" and "https()" to query HTTP headers, and added "status()" and "method()" functions to you can easily query the HTTP status of your last call, and the HTTP method being used to call your script.

<h3>Feb 4, 2009: Released version 1.2 with GET, HEAD, POST, PUT and DELETE</h3>
I've replaced the "read()" function with various HTTP methods such as "GET()", "HEAD()", "POST()", "PUT()" and "DELETE()" to that the script can be used in RESTful applications.

<h3>Feb 2, 2009: Released version 1.1 with some fixes</h3>
The HTTP headers weren't being cached so I've recoded the caching to include the HTTP headers. I also improved the user agent string and beautified the code just a tiny bit. I'm working on a test suite to avoid regression bugs in future versions.

<h3>Feb 1, 2009: Created the notex.com web site</h3>
I spent about 5 hours putting together a basic notex.com web site using jQuery's tabs and Xara Extreme 4 to design a cute green logo. The site is also mirrored at notex.info which might become the main domain in the future.
